home *** CD-ROM | disk | FTP | other *** search
/ Delphi Informant Complete 1995 - 2000 / Delphi Informant Complete 1995 to 2000.iso / Delphi Informant Magazine Complete Works SOURCE CODE 1998.rar / 1998 / Sep / di9809cd / SharedMemory.PAS next >
Pascal/Delphi Source File  |  1997-12-12  |  3KB  |  103 lines

  1. unit sharedmemory;
  2.  
  3. interface
  4. uses
  5.   SysUtils, Classes, Windows, Dialogs;
  6.  
  7. type
  8.  
  9. { WIN32 Helper Classes }
  10.  
  11. { THandledObject }
  12.  
  13. { This is a generic class for all encapsulated WinAPI's which need to call
  14.   CloseHandle when no longer needed.  This code eliminates the need for
  15.   3 identical destructors in the TEvent, TMutex, and TSharedMem classes
  16.   which are descended from this class. }
  17.  
  18.   THandledObject = class(TObject)
  19.   protected
  20.     FHandle: THandle;
  21.   public
  22.     destructor Destroy; override;
  23.     property Handle: THandle read FHandle;
  24.   end;
  25.  
  26.   { TSharedMem }
  27.  
  28. { This class simplifies the process of creating a region of shared memory.
  29.   In Win32, this is accomplished by using the CreateFileMapping and
  30.   MapViewOfFile functions. }
  31.  
  32.   TSharedMem = class(THandledObject)
  33.   private
  34.     FName: string;
  35.     FSize: Integer;
  36.     FCreated: Boolean;
  37.     FFileView: Pointer;
  38.   public
  39.     constructor Create(const Name: string; Size: Integer);
  40.     constructor Access(const Name: string);
  41.     destructor Destroy; override;
  42.     property Name: string read FName;
  43.     property Size: Integer read FSize;
  44.     property Buffer: Pointer read FFileView;
  45.     property Created: Boolean read FCreated;
  46.   end;
  47.  
  48. implementation
  49.  
  50.  { THandledObject }
  51.  
  52. destructor THandledObject.Destroy;
  53. begin
  54.   if FHandle <> 0 then
  55.     CloseHandle(FHandle);
  56. end;
  57.  
  58. { TSharedMem }
  59.  
  60. constructor TSharedMem.Create(const Name: string; Size: Integer);
  61. begin
  62.   inherited Create;
  63.   try
  64.     FName := Name;
  65.     FSize := Size;
  66.     { CreateFileMapping, when called with $FFFFFFFF for the hanlde value,
  67.       creates a region of shared memory }
  68.     FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
  69.         Size, PChar(Name));
  70.     if FHandle = 0 then
  71.       abort;
  72.     FCreated := (GetLastError = 0) or (GetLastError = ERROR_ALREADY_EXISTS);
  73.     { We still need to map a pointer to the handle of the shared memory region }
  74.     FFileView := MapViewOfFile(FHandle, FILE_MAP_WRITE, 0, 0, Size);
  75.     if FFileView = nil then
  76.       abort;
  77.   except
  78.     messagedlg(Format('Error creating shared memory %s (%d)', [Name, GetLastError]), mtError, [mbOK], 0);
  79.   end;
  80. end;
  81.  
  82. constructor TSharedMem.Access(const Name: string);
  83. begin
  84.   inherited Create;
  85.   FName := Name;
  86.   FFileView := nil;
  87.   FHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,PChar(Name));
  88.   if FHandle = 0 then
  89.     Exit;
  90.   { We still need to map a pointer to the handle of the shared memory region }
  91.   FFileView := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  92. end;
  93.  
  94.  
  95. destructor TSharedMem.Destroy;
  96. begin
  97.   if FFileView <> nil then
  98.     UnmapViewOfFile(FFileView);
  99.   inherited Destroy;
  100. end;
  101.  
  102. end.
  103.